from numpy import (
    ndarray,
    concatenate,
    real,
    imag,
    sqrt,
    sin,
    cos,
    arctan2,
)

def complex_vector_to_double_real_vector(
        input_vector: ndarray,
) -> ndarray:
    """
    将复数向量转换为双重实数向量。

    参数:
        input_vector (ndarray): 输入的复数向量。

    返回:
        ndarray: 转换后的双重实数向量，其中实部和虚部分别作为单独的实数部分。
    """
    # 将复数向量的实部和虚部分开，并将它们连接成一个新的实数向量
    return concatenate([real(input_vector), imag(input_vector)],
                       dtype='float32')


def real_vector_to_half_complex_vector(
        input_vector: ndarray,
) -> ndarray:
    """
    将实数向量转换为半长度复数向量。

    参数:
        input_vector (ndarray): 输入的实数向量。

    返回:
        ndarray: 转换后的复数向量，其中前半部分作为实部，后半部分作为虚部。
    """
    # 计算实数向量的分界点
    real_part_cutoff_index = int(len(input_vector) / 2)

    # 通过将实数向量的前半部分作为实部，后半部分作为虚部，创建复数向量
    half_length_complex_vector = input_vector[:real_part_cutoff_index] + 1j * input_vector[real_part_cutoff_index:]

    return half_length_complex_vector


def complex_vector_to_rad_and_phase(
        input_vector: ndarray,
) -> ndarray:
    """
    将复数向量转换为幅度和相位表示。

    参数:
        input_vector (ndarray): 输入的复数向量。

    返回:
        ndarray: 包含幅度和相位的数组。
    """
    # 计算复数向量的幅度
    radius = sqrt(real(input_vector)**2 + imag(input_vector)**2)
    # 计算复数向量的相位
    angle = arctan2(imag(input_vector), real(input_vector))

    # 将幅度和相位连接成一个新的数组
    return concatenate([radius, angle])


def rad_and_phase_to_complex_vector(
        input_vector: ndarray,
) -> ndarray:
    """
    将幅度和相位向量转换为复数向量。

    参数:
        input_vector (ndarray): 包含幅度和相位的数组。

    返回:
        ndarray: 转换后的复数向量。
    """
    # 计算实数部分的分界点
    real_part_cutoff_index = int(len(input_vector) / 2)

    # 使用幅度和相位信息生成复数向量
    half_length_complex_vector = (
            input_vector[:real_part_cutoff_index] * cos(input_vector[real_part_cutoff_index:])
            + 1j * input_vector[:real_part_cutoff_index] * sin(input_vector[real_part_cutoff_index:])
    )

    return half_length_complex_vector
